package cn.lianyutiantang.processor;

import cn.lianyutiantang.controller.FileController;
import cn.lianyutiantang.model.FileObj;
import cn.lianyutiantang.model.RealPathDTO;
import cn.lianyutiantang.model.ResultDTO;
import cn.lianyutiantang.service.user.FileService;
import cn.lianyutiantang.utils.FileUtil;
import cn.lianyutiantang.utils.RestTemplateUtil;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

@Component
public class FileSyncProcessor {
    @Autowired
    private FileService fileService;
    @Value("${windowsimg.path}")
    private String windowsimgPath; //保存到windos的路径
    @Value("${windowsimg.backuppath}")
    private String windowsimgbackuppath; //保存到windos备份的路径
    @Value("${linuximg.path}")
    private String linuximgPath;//保存到Linux的路径
    @Value("${linuximg.backuppath}")
    private String linuximgbackuppath;//保存到Linux的备份路径

    @Value("${system.backupurl}")
    private String systemBackupUrl;//系统备份文件服务器url
    @Value("${system.sysremark}")
    private String systemSysremark;//主机保存之后留存的痕迹
    @Value("${system.backsysremark}")
    private String systemBackSysRemark;//备份机器文件
    private static final Logger logger = LoggerFactory.getLogger(FileSyncProcessor.class);
    @Autowired
    FileController fileController;


    @Scheduled(fixedDelay = 30000)//每30秒执行一次
    private void fileSync() {
        /*
         当前系统	    当前系统需要备份的系统	当前系统标注	备份系统标注
         192.168.0.101	192.168.0.100	        filesystem1	     filesystem2
         192.168.0.100	192.168.0.101	        filesystem2	     filesystem1
         */
        List<FileObj> files = fileService.findByBackAysRemark(systemSysremark);//查询当前备份系统标注为当前系统标注的数据
        if (files == null || files.size() == 0) {
            logger.info("数据查询不到传入文件id的数据！");
            return;
        }
        //把当前的文件上传到备份文件库的相对应的目录去
        for (FileObj file : files) {
            try {
                //拿到图片主体并保存
                RealPathDTO realPathDTO = new RealPathDTO();
                realPathDTO.setRealPath((file.getOrigPath()).replace("//", "/"));//默认获取原文路径
                ResultDTO result = RestTemplateUtil.postJson("http://" + systemBackupUrl + "/getNetBase64ByRealPath", realPathDTO, ResultDTO.class);
                String base64 = result.getBase64();
                if (StringUtils.isEmpty(base64)) {
                    logger.info("并没有从主数据库查询到相对应的文件base64流，请确认主系统的文件是否异常："+JSON.toJSONString(file));
                    continue;
                }
                //把base64保存到当前系统，然后修改当前这条记录的备份系统标注
                boolean ok = FileUtil.makePicture(base64, file.getInsideNetworkDirectory(), file.getWorkUploadFileId() + "." + file.getType());
                if (!ok) {
                    continue;
                }
                //判断当前文件类型是否为图片，如果是图片的话才处理图片缩略的问题
                if(fileController.isPicture(file.getType())){
                    realPathDTO.setRealPath((file.getThumbPath()).replace("//", "/"));//默认获取原文路径
                    ResultDTO resultThumb = RestTemplateUtil.postJson("http://" + systemBackupUrl + "/getNetBase64ByRealPath", realPathDTO, ResultDTO.class);
                    String base64Thumb = resultThumb.getBase64();
                    ok = FileUtil.makePicture(base64Thumb, file.getInsideNetworkDirectory(), "small"+file.getWorkUploadFileId() + "." + file.getType());
                    if (!ok) {
                        continue;
                    }
                }
                file.setBackSysRemark(file.getBackSysRemark() + "_sync");
            } catch (Exception e) {
                logger.error("同步数据异常"+ JSON.toJSONString(file)+",异常信息为："+e);
                e.printStackTrace();
            }
        }
        if(files!=null &&files.size()>0){
            int iii = fileService.updataBatchSysRemark(files);
        }

    }
}
